package smlab.view.ui
{
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	
	import smlab.view.ui.UIEvent.UIEvent;
	
	/**
	 * UI 面板管理器
	 * @author simon
	 * 
	 */
	public class UIManager_SM extends EventDispatcher
	{
		private static var _instance:UIManager_SM;
		private var _LoadingPanel:LoadingPanel_SM;			//loading 界面
		private var _currentPanel:Panel_SM;				//当前打开的面板的实例
		private var _LoadCancelFun:Function;				//加载取消执行的方法
		
		public function UIManager_SM(target:IEventDispatcher=null)
		{
			super(target);
		}
		
		public static function getInstance() : UIManager_SM
		{
			if (_instance == null)
			{
				_instance = new UIManager_SM;
			}
			return _instance;
		}
		
		/**
		 * 
		 * @param p						已经实例化的 Panel_SM
		 * @param container				Panel_SM 的父级容器,加载完成后 Panel 会被 addChild 到父容器，设为 null 则不做任何 addChild 操作。
		 * @param url					面板UI swf 的路径
		 * @param UIName				UI的导出类名或者元件变量名,设为默认值则不做取皮肤的操作
		 * @param getUIType				0 代表直接取 Loader.content 作为 UI；								GetUIType.isLoaderContent
		 * 								1 代表获取 Loader content 的子元件作为 UI； 						GetUIType.fromLoaderContentByChildName
		 * 								2 代表从 loader.contentLoaderInfo 的域中获取类并实例化作为 UI		GetUIType.getDefFromLoaderAppByName
		 * @param LoadCancelFun			加载被取消后执行的方法
		 * @param panelHideFun			面板隐藏后执行的方法，只会执行一次，执行完会置 null
		 * @param loadingStr			将要在 Loading 面板显示的文字
		 * @param isShowLoading			是否显示 Loading 条
		 * @param isSaveLoader			是否保存loader，以便从 loader 获取其它类定义。请调用 Panel_SM 的 getClassFromLoaderByName 以获取类定义。
		 * @param dragEnable_			是否可拖动
		 */
		public function showPanel(
			p:Panel_SM,
			container:DisplayObjectContainer=null,
			url:String="",
			UIName:String="",
			getUIType:uint=0,
			completeFun:Function=null,
			cancelFun:Function=null,
			panelHideFun:Function=null,
			loadingStr:String="正在加载……",
			isShowLoading:Boolean=true,
			isShowCloseBtn:Boolean=true,
			isSaveLoader:Boolean=false,
			dragEnable:Boolean=true
			) : void
		{
			removeCurrentPanel();
			_currentPanel=p;
			_LoadCancelFun=cancelFun;
			_currentPanel.addEventListener(UIEvent.UI_LOAD_COMPLETE,onPanelUILoaded);
			
			if(loadingPanel){
				if(isShowLoading)
				{
					loadingPanel.show();
				}else{
					loadingPanel.hide();
				}
			}
			
			_currentPanel.loadUI(container,url,UIName,getUIType,completeFun,isShowLoading,isShowCloseBtn,cancelFun,panelHideFun,isSaveLoader,dragEnable,loadingStr);
		}
		
		private function onPanelUILoaded(e:UIEvent) : void
		{
			if(loadingPanel){
				loadingPanel.hide();
			}
			
			removeCurrentPanel();
		}
		
		private function removeCurrentPanel():void
		{
			if(_currentPanel){
				_currentPanel.removeEventListener(UIEvent.UI_LOAD_COMPLETE,onPanelUILoaded);
			}
			
			_currentPanel=null;
			_LoadCancelFun=null;
		}
		
		public function stopLoadCurrentPanel() : void
		{
			if(_currentPanel){
				onLoadCancel(null);
			}
		}
		
		/**
		 * 隐藏监听了该事件的所有弹出面板
		 * 
		 */
		public function hideAllPanel() : void
		{ 
			dispatchEvent(new UIEvent(UIEvent.HIDE_ALL_PANEL));
		}
		
		/**
		 * 
		 * 
		 * @param uiName
		 * 
		 */
		/**
		 * 可以随意设置自己的 Loading 界面
		 * 但是如果你希望 Loading 界面是统一的，那么这个方法只在 UIManager_SM 初始化的时候调用一次。
		 * 
		 * @param loadingContainer	
		 * @param ui			
		 * @param showLoadingDelay	//加载时延迟显示 loading 的时间。避免加载已经存在于IE缓存里的UI时也看见 Loaing
		 * 
		 */
		public function setLoadingUI(loadingContainer:DisplayObjectContainer,ui:DisplayObject=null,showLoadingDelay:Number=0) : void
		{
			removeLoading();
			
			if(!ui){
				return;
			}
			_LoadingPanel=new LoadingPanel_SM();
			_LoadingPanel.showLoadingDelay=showLoadingDelay;
			_LoadingPanel.addEventListener(UIEvent.CANCEL_LOADING,onLoadCancel);
			_LoadingPanel.skin=ui;
			_LoadingPanel.hide();
			
			if(loadingContainer){
				loadingContainer.addChild(_LoadingPanel);
			}
		}
		
		/**
		 * 点击 Loading 上的关闭按钮-取消加载
		 * @param e
		 * 
		 */
		private function onLoadCancel(e:UIEvent) : void
		{
			if(_LoadCancelFun!=null){
				_LoadCancelFun();
				_LoadCancelFun=null;
			}
			
			if(_currentPanel){
				_currentPanel.removeAll();
			}
			
			removeCurrentPanel();
			
			if(loadingPanel){
				loadingPanel.hide();
			}
		}
		
		public function get loadingPanel() : LoadingPanel_SM
		{
			return _LoadingPanel;
		}
		
		private function removeLoading():void
		{
			if(_LoadingPanel){
				_LoadingPanel.hide();
				
				if(_LoadingPanel.parent){
					_LoadingPanel.parent.removeChild(_LoadingPanel);
				}
				
				_LoadingPanel.removeEventListener(UIEvent.CANCEL_LOADING,onLoadCancel);
				_LoadingPanel=null;
			}
		}
	}
}